package org.yzhzc.friend.rabbit;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.yzhzc.api.domain.dto.JudgeSubmitDTO;
import org.yzhzc.common.core.constants.RabbitMQConstants;
import org.yzhzc.common.core.enums.ResultCode;
import org.yzhzc.common.security.exception.ServiceException;

/**
 * 判题任务生产者。
 * 负责将判题任务发送到 RabbitMQ 队列中，供消费者处理。
 *
 * 主要功能：
 * - 将判题任务（JudgeSubmitDTO）发送到指定的 RabbitMQ 队列。
 * - 捕获发送消息时的异常，并记录日志或抛出业务异常。
 *
 * 使用场景：
 * - 当用户提交代码后，调用该类的 `produceMsg` 方法将判题任务发送到队列。
 * - 消费者从队列中获取任务并进行判题。
 */
@Slf4j // Lombok 注解，自动生成日志对象 log
@Component // 标识该类为 Spring 组件，由 Spring 容器管理
public class JudgeProducer {

    @Autowired // 自动注入 RabbitTemplate 实例
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送判题任务到 RabbitMQ 队列。
     *
     * @param judgeSubmitDTO 判题任务信息，包含代码、题目 ID、用户 ID 等
     * @throws ServiceException 如果发送消息失败，则抛出业务异常
     */
    public void produceMsg(JudgeSubmitDTO judgeSubmitDTO) {
        try {
            // 将判题任务发送到指定的 RabbitMQ 队列
            rabbitTemplate.convertAndSend(RabbitMQConstants.OJ_WORK_QUEUE, judgeSubmitDTO);
        } catch (Exception e) {
            // 捕获异常并记录日志
            log.error("生产者发送消息异常", e);
            // 抛出业务异常，提示消息发送失败
            throw new ServiceException(ResultCode.FAILED_RABBIT_PRODUCE);
        }
    }
}